#if 1

#include <iostream>

using namespace std;

//将二进制倒数第M位的前N位取反


/**
    异或操作：一个数取反，就是这个数和全1的数进行异或操作

    现在要求一个数：  ----(M-N)------M----,对这个数中间部分N位取反
    只需要找到一个这样的数即可：00000111111100000，中间N位为1即可

    根据上述分析，可以分为三步：
        1. 对0000000001，左移n位，-->  00001000000,注意：这个1实际上在n+1位上
        2. 对左移后的数进行-1，就会得到---> 00000111111
        3. 对上述的数左移M位，可以得到：00111111000。
*/

int getNum(int num,int m,int n)
{
    int i = 1<<n;
    i--;
    i = i<<m;
    return num^i;
}

int main()
{
    //测试案例：num=15(1111),m = 2,n=2; --> 0001>>2 = 0100 ，-1=0011，<<2 = 1100 ,& = 0011 = 3
    cout <<"输入num，m，n(用空格隔开)"<<endl;
    int num,m,n;
    cin>>num>>m>>n;
    cout<<"num="<<num<<",m="<<m<<",n="<<n<<",取反后的结果："<<getNum(num,m,n)<<endl;
	system("pause");
	return 0;
}
#endif
